package com.dgz.csmall.commons.web;

import com.dgz.csmall.commons.ex.ServiceException;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * @Author duguozheng
 * @Date 2023/05/11  17:37
 * @Description json统一结果响应类，作为业务方法返回值，封装异常信息和对应状态码
 * @Version 1.0
 */
@Data
/*默认值为false，当设置为true时，生成的setter方法会返回当前对象实例，以便于链式调用。*/
@Accessors(chain = true)
public class JsonResult<T> implements Serializable {

    @ApiModelProperty("业务状态码")
    private Integer state;  //操作结果的状态标识码

    @ApiModelProperty("提示文本")
    private String message; //操作失败时的提示文本

    @ApiModelProperty("数据")
    private T data;    //操作成功时的响应数据

    /**
     * 用来描述操作成功
     * @return JsonResult对象
     */
    public static JsonResult<Void> ok() {
        return ok(null);
    }

    /**
     * 生成表示“成功”的响应对象，此对象中包含响应到客户端的数据
     * @param data 响应到客户端的数据
     * @return 表示”成功“的响应对象
     */
    public static <T> JsonResult<T> ok(T data) {
        JsonResult<T> jsonResult = new JsonResult<>();
        jsonResult.setState(ServiceCode.OK.getValue());
        jsonResult.setData(data);
        return jsonResult;
    }

    /**
     * 用来描述操作失败
     * @param e 业务异常
     * @return 表示失败的响应对象
     */
    public static JsonResult<Void> fail(ServiceException e) {
        return fail(e.getServiceCode(), e.getMessage());
    }

    /**
     * 用来描述操作失败
     * @param serviceCode 状态码
     * @param message 提示信息
     * @return 表示失败的JsonResult对象
     */
    public static JsonResult<Void> fail(ServiceCode serviceCode, String message) {
        JsonResult<Void> jsonResult = new JsonResult<>();
        jsonResult.setState(serviceCode.getValue());
        jsonResult.setMessage(message);
        return jsonResult;
    }
}
